﻿using Demo.Domains.Entities.Sys; // 引用 SysArea 实体类所在的命名空间
using Demo.PetaPoco.Application.DbContexts; // 引用数据库上下文
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection; // 依赖注入相关
using PetaPoco; // 使用 PetaPoco ORM
using PmSoft.Cache.Abstractions; // 缓存抽象层
using PmSoft.Core; // 核心功能
using PmSoft.Data.PetaPoco.Repositories; // PetaPoco 仓储基类

namespace Demo.PetaPoco.Application.Services.Area; // 仓储类所在的命名空间

/// <summary>
/// 行政区划仓储类，提供对 SysArea 实体的数据库操作和缓存支持
/// </summary>
[Inject(ServiceLifetime.Scoped)] // 依赖注入配置，生命周期为 Scoped
public class AreaRepository : CacheRepository<AppDbContext, SysArea, int> // 继承缓存仓储基类
{
	private readonly IMemoryCache memoryCache;
	/// <summary>
	/// 构造函数，注入数据库上下文和应用上下文
	/// </summary>
	/// <param name="dbContext">应用程序数据库上下文</param>
	/// <param name="applicationContext">应用上下文</param>
	public AreaRepository(AppDbContext dbContext, IApplicationContext applicationContext, IMemoryCache memoryCache)
		: base(dbContext, applicationContext) // 调用基类构造函数
	{
		this.memoryCache = memoryCache;
	}

	/// <summary>
	/// 异步获取所有行政区划信息（带缓存）
	/// </summary>
	/// <returns>返回 SysArea 实体的集合</returns>
	public async Task<IEnumerable<SysArea>?> GetAllAsync()
	{
		// 获取全局缓存版本号，用于缓存键的动态更新
		int globalVersion = await CacheVersionService.GetGlobalVersionAsync();
		string cacheKey = $"AllArea:{globalVersion}";
		return await memoryCache.GetOrCreateAsync<IEnumerable<SysArea>>(cacheKey, async (key) =>
		   {
			   Sql sql = Sql.Builder.Select("*").From("sys_area");
			   return await DbContext.FetchAsync<SysArea>(sql);
		   });


	}
}